package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 提高每次读写的数据量。减少读写的次数，可以提高读写的效率
 *
 * 单字节读写是一种随机读写形式
 * 一组字节的读写的块读写形式
 * 对于机械硬盘和很多其他硬件而言，快读写的效率很好，但是随机读写性能差
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("ppt.pptx");
        FileOutputStream fos = new FileOutputStream("ppt_cp2.pptx");

        /*
            流提供了块读写操作
            InputStream定义的块读操作
            int read(byte[] data)
            一次性读取给定字节数组总长度的字节量并存入到该数组中，返回值表示实际读取
            到的字节数，若返回值为-1则表示本次没有读取到任何数据，且已经是文件末尾了

            文件数据:
            11000011 11110000 10101010 01010101 11001100 00001111
            ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^

            byte[] data = new byte[4];//4字节的数组
            int len;

            len = fis.read(data);
            从文件中一次性读取4个字节并存入data数组，返回的len表示实际读取到了几个字节
            data:{11000011 11110000 10101010 01010101}
            len = 4;


            第二次调用:
            文件数据:
            11000011 11110000 10101010 01010101 11001100 00001111
                                                ^^^^^^^^ ^^^^^^^^
                                                文件只剩下两个字节可以读取
            len = fis.read(data);
            data:{11001100 00001111 10101010 01010101}
                  |本次读取到的2字节| |上次遗留无用数据 |
            len = 2;

            第三次读取:
            11000011 11110000 10101010 01010101 11001100 00001111 文件末尾
                                                                  ^^^^^^
            len = fis.read(data);
            data:{11001100 00001111 10101010 01010101}
                  |         都是无用数据             |
            len = -1;

         */
        byte[] data=new byte[1024*10];
        int len;
        long start=System.currentTimeMillis();
        while ((len =fis.read(data))!=-1){
            fos.write(data);
        }
        long end=System.currentTimeMillis();
        System.out.println("复制完毕！耗时："+(end-start)+"ms");
        fis.close();
        fos.close();

    }
}
